[LeetCode]43 高精度乘法 您所在的位置:网站首页 字符串相乘 leetcode [LeetCode]43 高精度乘法

[LeetCode]43 高精度乘法

2023-06-07 17:56| 来源: 网络整理| 查看: 265

Multiply Strings(高精度乘法)

【难度:Medium】 Given two numbers represented as strings, return multiplication of the numbers as a string.

Note: The numbers can be arbitrarily large and are non-negative. 实现高精度非负整数乘法。

解题思路

按照常规解法,用字符串操作来模拟乘法的步骤可以先实现字符串高精度加法,再将加法运用到乘法过程中。这种方法简单但是耗时比较大,这里介绍一种比较巧妙的方法,借鉴LeetCode上的一份高票代码。 这里写图片描述 观看上图,它描述的是我们计算乘法的过程。仔细分析可以发现,对于原来在上面字符串中下标为1的“2”和在下面字符串中下标为0的“4”的相乘结果08出现在了最后的乘法结果字符串的下标1和2处。这一结果对其他下标的数字同样成立:下标i和下标j相乘的高位结果位于下标i+j处,低位位于下标i+j+1处。根据这个结果,实现高精度的乘法就变得简单了。

c++代码如下:

//高票代码版本 class Solution { public: string multiply(string num1, string num2) { int m = num1.size(); int n = num2.size(); vector array(m+n); string ans = ""; for (int i = m-1; i >= 0; i--) { for (int j = n-1; j >= 0; j--) { int index1 = i + j; int index2 = i + j + 1; int sum = (num1[i]-'0')*(num2[j]-'0')+array[index2]; array[index1] += sum / 10; array[index2] = sum % 10; } } for (auto v:array) { if (ans.size() != 0 || v != 0) ans += to_string(v); } return ans.size() == 0?"0":ans; } }; //简单但低效版本 class Solution { public: string multiply(string num1, string num2) { if(num1.empty()) return num2; if (num2.empty()) return num1; if (num1.size() == 1 && num1[0] == '0') return "0"; if (num2.size() == 1 && num2[0] == '0') return "0"; string ans = ""; int count = -1; for (int i = num1.size()-1;i >= 0; i--) { string tmp = ""; int carry = 0; count++; for (int j = num2.size()-1; j >= 0; j--) { int m = (num1[i]-'0')*(num2[j]-'0')+carry; carry = m / 10; tmp = to_string(m%10)+tmp; } if (carry) tmp = to_string(carry)+tmp; int count_tmp = count; while (count_tmp) { tmp = tmp + "0"; count_tmp--; } ans = add(ans,tmp); } return ans; } string add(string num1, string num2) { if(num1.empty()) return num2; if (num2.empty()) return num1; int carry = 0; int i = num1.size()-1; int j = num2.size()-1; string ans = ""; while (i >= 0 && j >= 0) { int m = (num1[i]-'0')+(num2[j]-'0')+carry; carry = m / 10; ans = to_string(m%10) + ans; i--; j--; } while (i >= 0) { int m = (num1[i]-'0')+carry; carry = m / 10; ans = to_string(m%10) + ans; i--; } while (j >= 0) { int m = (num2[j]-'0')+carry; carry = m / 10; ans = to_string(m%10) + ans; j--; } if (carry) ans = to_string(carry)+ans; return ans; } };


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有